//#include"Socket.hpp"
//#include"../Channel/Channel.hpp"
#include<functional>
#include<time.h>
#include<stdlib.h>
#include"../Connection/Connection.hpp"
#include"../Acceptor/Acceptor.hpp"
#include"../LoopThread/LoopThread.hpp"
#include"../TcpServer/TcpServer.hpp"

//TcpServer测试
void close_callback(const ConnectPtr conn)
{
    DBG_LOG("Del connection:%p", conn.get())
}

void connected_callback(const ConnectPtr conn)
{
    DBG_LOG("New connection:%p", conn.get())
}

void message_callback(const ConnectPtr conn, Buffer* buf)
{
    //拿出数据
    DBG_LOG("%s", buf->get_read_ptr());
    buf->move_read_pos(buf->get_readable_size());

    //发送处理后的数据
    std::string s("我是帅哥");
    conn->SendInLoop(s.c_str(), s.size());
    conn->CloseInLoop();
}

int main()
{
    TcpServer server(8888);
    server.SetThreadCount(2);
    server.SetInactiveRelease(10);
    server.SetCloseCallback(close_callback);
    server.SetMessageCallback(message_callback);
    server.SetConnectedCallback(connected_callback);
    server.Start();
    return 0;
}
//LoopThread 测试
// std::unordered_map<uint64_t, ConnectPtr> conns;
// uint64_t conn_fd = 0;
// EventLoop baseloop;//主线程的Loop
// LoopThreadPool Pool(&baseloop, 2);

// void close_callback(const ConnectPtr conn)
// {
//     conns.erase(conn->GetConnfd());
    
// }

// void connected_callback(const ConnectPtr conn)
// {
//     std::cout << "new connection:" << conn.get() << std::endl;
// }

// void message_callback(const ConnectPtr conn, Buffer* buf)
// {
//     //拿出数据
//     DBG_LOG("%s", buf->get_read_ptr());
//     buf->move_read_pos(buf->get_readable_size());

//     //发送处理后的数据
//     std::string s("我是帅哥");
//     conn->SendInLoop(s.c_str(), s.size());
//     //conn->CloseInLoop();
// }

// void Connectcb(int newfd)
// {
//     //创建新channel
//     conn_fd++;
//     ConnectPtr conn(new Connection(Pool.NextLoop(), conn_fd, newfd));
//     //设置回调
//     conn->SetSrvCloseCallback(std::bind(close_callback, std::placeholders::_1));
//     conn->SetMessageCallback(std::bind(message_callback, std::placeholders::_1, std::placeholders::_2));
//     conn->SetConnectedCallback(std::bind(connected_callback, std::placeholders::_1));
    
//     conn->EnableInactiveReleaseInLoop(3);
//     conn->EstablishedInLoop();
//     conns.insert(std::make_pair(conn_fd, conn));
// }
// int main()
// {
//     srand(time(NULL));
//     Acceptor acceptor(&baseloop, 8888);
//     //设置监听channel读回调函数
//     acceptor.SetConnectionCallback(std::bind(Connectcb, std::placeholders::_1));
//     acceptor.Listen();
//     baseloop.Handle();
// }

//Acceptor调试
// std::unordered_map<uint64_t, ConnectPtr> conns;
// uint64_t conn_fd = 0;
// EventLoop loop;

// void close_callback(const ConnectPtr conn)
// {
//     conns.erase(conn->GetConnfd());
    
// }

// void connected_callback(const ConnectPtr conn)
// {
//     std::cout << "new connection:" << conn.get() << std::endl;
// }

// void message_callback(const ConnectPtr conn, Buffer* buf)
// {
//     //拿出数据
//     DBG_LOG("%s", buf->get_read_ptr());
//     buf->move_read_pos(buf->get_readable_size());

//     //发送处理后的数据
//     std::string s("我是帅哥");
//     conn->SendInLoop(s.c_str(), s.size());
//     //conn->CloseInLoop();
// }

// void Connectcb(int newfd)
// {
//     //创建新channel
//     ConnectPtr conn(new Connection(&loop, conn_fd, newfd));
//     //设置回调
//     conn->SetSrvCloseCallback(std::bind(close_callback, std::placeholders::_1));
//     conn->SetMessageCallback(std::bind(message_callback, std::placeholders::_1, std::placeholders::_2));
//     conn->SetConnectedCallback(std::bind(connected_callback, std::placeholders::_1));
    
//     conn->EnableInactiveReleaseInLoop(3);
//     conn->EstablishedInLoop();
//     conns.insert(std::make_pair(conn_fd, conn));
// }
// int main()
// {
//     srand(time(NULL));
//     Acceptor acceptor(&loop, 8888);
//     //设置监听channel读回调函数
//     acceptor.SetConnectionCallback(std::bind(Connectcb, std::placeholders::_1));
//     acceptor.Listen();
//     while(1)
//     {
//         loop.Handle();
//     }
// }

//Connection调试
// std::unordered_map<uint64_t, ConnectPtr> conns;
// uint64_t conn_fd = 0;

// void close_callback(const ConnectPtr conn)
// {
//     conns.erase(conn->GetConnfd());
    
// }

// void connected_callback(const ConnectPtr conn)
// {
//     std::cout << "new connection:" << conn.get() << std::endl;
// }

// void message_callback(const ConnectPtr conn, Buffer* buf)
// {
//     //拿出数据
//     DBG_LOG("%s", buf->get_read_ptr());
//     buf->move_read_pos(buf->get_readable_size());

//     //发送处理后的数据
//     std::string s("我是帅哥");
//     conn->SendInLoop(s.c_str(), s.size());
//     //conn->CloseInLoop();
// }

// void Acceptor(Channel* ch, EventLoop* loop)
// {
//     int fd = ch->get_fd();
//     int newfd = accept(fd, nullptr, nullptr);
//     //创建新channel
//     ConnectPtr conn(new Connection(loop, conn_fd, newfd));
//     //设置回调
//     conn->SetSrvCloseCallback(std::bind(close_callback, std::placeholders::_1));
//     conn->SetMessageCallback(std::bind(message_callback, std::placeholders::_1, std::placeholders::_2));
//     conn->SetConnectedCallback(std::bind(connected_callback, std::placeholders::_1));
    
//     conn->EnableInactiveReleaseInLoop(3);
//     conn->EstablishedInLoop();
//     conns.insert(std::make_pair(conn_fd, conn));
// }
// int main()
// {
//     srand(time(NULL));
//     Socket lis_socket;
//     EventLoop loop;
//     lis_socket.CreateServer("0.0.0.0", 8888);
//     //为监听套接字创建channel
//     Channel channel(lis_socket.get_fd(), &loop);
//     //设置监听channel读回调函数
//     channel.set_read_callback(std::bind(Acceptor, &channel, &loop));
//     channel.EnableRead();
//     while(1)
//     {
//         loop.Handle();
//     }
//     lis_socket.Close();
// }

//Channel Poller EventLoop TimeWheel的联调
// void HandleClose(Channel* channel, unsigned long int id)
// {
//     if (!channel) return;  // 防止重复关闭或无效调用
//     DBG_LOG("close:%ld", id);
//     channel->MarkClosed();  // 标记为已关闭
    
//     // EventLoop* loop = channel->GetLoop();
//     // loop->Remove(channel);

//     channel->RemoveAll();
//     delete channel;
//     channel = nullptr; // 标记为无效
// }
// void HandleRead(Channel* channel, unsigned long int id)
// {
//     char buf[1024] = {0};
//     int ret = recv(channel->get_fd(), buf, 1023, 0);
//     if(ret < 0)
//     {
//         std::cout << "read end" << std::endl;
//         HandleClose(channel, id);
//     }
//     DBG_LOG("get:%s", buf);
//     channel->EnableWrite();//设置可写
// }
// void HandleWrite(Channel* channel, unsigned long int id)
// {
//     const char* msg = "我好帅！";
//     int ret = send(channel->get_fd(), msg, strlen(msg), 0);
//     if(ret < 0)
//     {
//         std::cout << "write fail" << std::endl;
//         HandleClose(channel, id);
//     }
//     channel->DisableWrite();//关闭写
// }
// void HandleError(Channel* channel, unsigned long int id)
// {
//     HandleClose(channel, id);
// }
// void HandleEvent(Channel* channel, EventLoop* loop, unsigned long int id)
// {
//     //刷新事件的时间轮
//     loop->FlushTimer(id);
// }
// //监听channel的读回调
// //1.为连接的套接字建立新的channel 
// //2.为新的channel设置回调函数
// void Acceptor(Channel* ch, EventLoop* loop)
// {
//     int fd = ch->get_fd();
//     int newfd = accept(fd, nullptr, nullptr);
//     if (newfd < 0) {
//         perror("accept failed");
//         return;
//     }
//     //创建新channel
//     Channel* channel = new Channel(newfd, loop);

//     //设置回调
//     unsigned long int timeid = rand()%10000;
//     channel->set_read_callback(std::bind(HandleRead, channel, timeid));
//     channel->set_write_callback(std::bind(HandleWrite, channel, timeid));
//     channel->set_error_callback(std::bind(HandleError, channel, timeid));
//     channel->set_close_callback(std::bind(HandleClose, channel, timeid));
//     channel->set_event_callback(std::bind(HandleEvent, channel, loop, timeid));

//     //设置线程10s不活跃就关闭连接
//     //这个设置要在启动可读前设置，因为启动可读后可能立即有事件发生，而此时还没有设置时间轮
//     loop->AddTimer(timeid, 10, std::bind(HandleClose, channel, timeid));
//     channel->EnableRead();//启动可读
// }
// int main()
// {
//     srand(time(NULL));
//     Socket lis_socket;
//     EventLoop loop;
//     lis_socket.CreateServer("0.0.0.0", 8888);
//     //为监听套接字创建channel
//     Channel channel(lis_socket.get_fd(), &loop);
//     //设置监听channel读回调函数
//     channel.set_read_callback(std::bind(Acceptor, &channel, &loop));
//     channel.EnableRead();
//     loop.Handle();
//     lis_socket.Close();
// }


//// Channel Poller EventLoop的联调
// void HandleClose(Channel* channel)
// {
//     std::cout << "close" << std::endl;
//     channel->RemoveAll();
//     delete channel;
// }
// void HandleRead(Channel* channel)
// {
//     char buf[1024] = {0};
//     int ret = recv(channel->get_fd(), buf, 1023, 0);
//     if(ret < 0)
//     {
//         std::cout << "read end" << std::endl;
//         HandleClose(channel);
//     }
//     std::cout << "get:" << buf << std::endl;
//     channel->EnableWrite();//设置可写
// }
// void HandleWrite(Channel* channel)
// {
//     const char* msg = "我好帅！\n";
//     int ret = send(channel->get_fd(), msg, strlen(msg), 0);
//     if(ret < 0)
//     {
//         std::cout << "write fail" << std::endl;
//         HandleClose(channel);
//     }
//     channel->DisableWrite();//关闭写
// }
// void HandleError(Channel* channel)
// {
//     HandleClose(channel);
// }
// void HandleEvent(Channel* channel)
// {
//     std::cout << "这是一个任意事件回调" << std::endl;
// }
// //监听channel的读回调
// //1.为连接的套接字建立新的channel 
// //2.为新的channel设置回调函数
// void Acceptor(Channel* ch, EventLoop* loop)
// {
//     int fd = ch->get_fd();
//     int newfd = accept(fd, nullptr, nullptr);
//     //创建新channel
//     Channel* channel = new Channel(newfd, loop);
//     //设置回调
//     channel->set_read_callback(std::bind(HandleRead, channel));
//     channel->set_write_callback(std::bind(HandleWrite, channel));
//     channel->set_error_callback(std::bind(HandleError, channel));
//     channel->set_close_callback(std::bind(HandleClose, channel));
//     channel->set_event_callback(std::bind(HandleEvent, channel));
//     channel->EnableRead();//启动可读
// }
// int main()
// {
//     Socket lis_socket;
//     EventLoop loop;
//     lis_socket.CreateServer("0.0.0.0", 8888);
//     //为监听套接字创建channel
//     Channel channel(lis_socket.get_fd(), &loop);
//     //设置监听channel读回调函数
//     channel.set_read_callback(std::bind(Acceptor, &channel, &loop));
//     channel.EnableRead();
//     while(1)
//     {
//         loop.Handle();
//     }
//     lis_socket.Close();
// }



//Channel Poller的联调
// void HandleClose(Channel* channel)
// {
//     std::cout << "close" << std::endl;
//     channel->RemoveAll();
//     delete channel;
// }
// void HandleRead(Channel* channel)
// {
//     char buf[1024] = {0};
//     int ret = recv(channel->get_fd(), buf, 1023, 0);
//     if(ret < 0)
//     {
//         std::cout << "read end" << std::endl;
//         HandleClose(channel);
//     }
//     std::cout << "get:" << buf << std::endl;
//     channel->EnableWrite();//设置可写
// }
// void HandleWrite(Channel* channel)
// {
//     const char* msg = "我好帅！\n";
//     int ret = send(channel->get_fd(), msg, strlen(msg), 0);
//     if(ret < 0)
//     {
//         std::cout << "write fail" << std::endl;
//         HandleClose(channel);
//     }
//     channel->DisableWrite();//关闭写
// }
// void HandleError(Channel* channel)
// {
//     HandleClose(channel);
// }
// void HandleEvent(Channel* channel)
// {
//     std::cout << "这是一个任意事件回调" << std::endl;
// }
// //监听channel的读回调
// //1.为连接的套接字建立新的channel 
// //2.为新的channel设置回调函数
// void Acceptor(Channel* ch, Poller* po)
// {
//     int fd = ch->get_fd();
//     int newfd = accept(fd, nullptr, nullptr);
//     //创建新channel
//     Channel* channel = new Channel(newfd, po);
//     //设置回调
//     channel->set_read_callback(std::bind(HandleRead, channel));
//     channel->set_write_callback(std::bind(HandleWrite, channel));
//     channel->set_error_callback(std::bind(HandleError, channel));
//     channel->set_close_callback(std::bind(HandleClose, channel));
//     channel->set_event_callback(std::bind(HandleEvent, channel));
//     channel->EnableRead();//启动可读
// }
// int main()
// {
//     Socket lis_socket;
//     Poller poller;
//     lis_socket.CreateServer("0.0.0.0", 8888);
//     //为监听套接字创建channel
//     Channel channel(lis_socket.get_fd(), &poller);
//     //设置监听channel读回调函数
//     channel.set_read_callback(std::bind(Acceptor, &channel, &poller));
//     channel.EnableRead();
//     while(1)
//     {
//         std::vector<Channel*> active;
//         poller.Handle(&active);
//         DBG_LOG("ready size:%d", (int)active.size());
//         for(auto e: active)
//         {
//             e->HandleEvent();
//         }
//     }
//     lis_socket.Close();
// }